package day015;

import java.util.concurrent.*;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:得到线程执行完毕之后的结果
 * @date 2019/8/3 0003
 */
public class CallableDemo {
    public static void main(String[] args) {
        //1. 创建一个线程池对象 - 缓存了很多线程
        ExecutorService executor = Executors.newCachedThreadPool();

        //2.创建线程对象
        C1 c = new C1();

        //提交一个线程的任务
        //将我们的线程对象交给线程池管理
        //执行线程
        //并没有执行结束,而是在等待,默认的大概是1min

        //Callable和Future配套使用
        //Future<Integer> future = executor.submit(c);

        //Callable和FutureTask配套使用
        FutureTask<Integer> future = new FutureTask<Integer>(c);

        executor.submit(future);

        //手动关闭线程池
        executor.shutdown();

        System.out.println("main主线程执行结束..");

        //获取线程的执行的结果
        try {
            Integer result = future.get();

            System.out.println("result:"+result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class C1 implements Callable<Integer>{//泛型取决于方法的返回的结果的类型
    @Override
    public Integer call() {

        System.out.println("子线程正在执行...");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        int sum = 0;

        for (int i = 1; i <= 100 ; i++) {
            sum+=i;
        }

        return sum;
    }

}
